import {type MenuItem } from '@/store/modules/user-info';//导入 store(pinia) 用户信息中的（菜单、按钮） 数据类型
import { useRouter } from 'vue-router';
/* 动态路由节点数据类型 定义 */
export interface RouterMap {
  path: string;
  name: string;
  meta: {
    pid: string; // 父菜单 ID（对应 module_parent_id）
    id: string; // 当前菜单 ID（对应 module_id）
    componentName: string; // 组件名称（用于映射组件路径）
    title: string; // 菜单标题（对应 module_name）
    icon: string | undefined; // 图标（对应 module_icon）
    hideInMenu: boolean; // 是否隐藏（默认 false）
    renameComponentFlag: boolean; // 组件重命名标记（默认 false）
  };
  component: () => Promise<unknown>; // 懒加载组件
  children?: RouterMap[]; // 子路由（嵌套路由）
}

/* 
 * 依据 pinia 中的 menu_list ,构建动态路由所有节点。
 * @param menu 菜单对象
 * @returns 路由节点数组
 */
export const buildDynamicRoutes = (menuList: MenuItem[]): RouterMap[] => {
  const modules = import.meta.glob('../views/**/**.vue');
  /* 1. 将 menu_list 中的单个菜单项 转换成 单个路由节点 */
  const convertToRoute = (menu: MenuItem,modules: Record<string, () => Promise<unknown>>): RouterMap => {
    const moduleName = menu.module_name;
    const moduleId = String(menu.module_id);
    const parentId = String(menu.module_parent_id);
    /* 将 module_link 转为路由名、组件名、组件所在目录名 */
    const tmp = menu.module_link.split('/');
    const componentName = tmp[tmp.length - 1]; //组件名
    const catalogName = tmp[1];//组件所在目录名
    
    const component = menu.module_link + ".vue";
    const componentPath = component && component.startsWith('/') ? component : '/' + component;
    const relativePath = `../views${componentPath}`;
    return {
      path: menu.module_link, // 生成路径
      name: moduleId, // 生成名称
      meta: {
        pid: parentId,
        id: moduleId,
        componentName: componentName, // 组件名称（用于映射组件路径）
        title: moduleName,
        icon: menu.module_icon || undefined,
        hideInMenu: false, // 默认为显示
        renameComponentFlag: false, // 默认为不重命名
      },
      // 懒加载组件（假设组件路径为 @/views/[模块名]/index.vue）
      component: modules[relativePath],
      children: [], // 初始化子路由数组
    };
  };

  /* 2. 遍历 menu_list ,调用 convertToRouter 函数,将 所有菜单项 转换 路由节点 */
  const routeList = menuList.map(menu => convertToRoute(menu,modules));

  /* 3-1. 构建父子路由关系（根据 pid 和 id 匹配）,生成完整的路由 */
  const buildNestedRoutes = (routes: RouterMap[]): RouterMap[] => {
    const topRoutes: RouterMap[] = []; // 顶级路由（pid=0）
    const routeMap = new Map<string, RouterMap>(); // 用 id 映射路由，方便查找

    // 先将所有路由存入 map
    routes.forEach(route => {
      routeMap.set(route.meta.id, route);
    });

    // 遍历路由，挂载到父路由的 children 中
    routes.forEach(route => {
      const parentId = route.meta.pid;
      if (parentId === '0') {
        // 顶级路由直接加入 topRoutes
        topRoutes.push(route);
      } else {
        // 查找父路由，加入其 children
        const parentRoute = routeMap.get(parentId);//获取路由对象的引用
        if (parentRoute) {
          parentRoute.children?.push(route);
        }
      }
    });

    return topRoutes;
  };
  /* 3-2. 构建菜单路由，（pid = 0 为模块名称（菜单目录名），路由只添加菜单。）, 与  3-1 选择使用 。*/
  const buildRoutes = (routes:RouterMap[]):RouterMap[] => {
    const listRouters: RouterMap[] = [];
    routes.forEach(route => {
      if (route.meta.pid === '0') { // parentId = 0 为模块名称（菜单目录名），路由只添加菜单。
        return;
      } else {
        listRouters.push(route);
      }
    });
    return listRouters;
  }
  // 生成菜单路由
  return buildRoutes(routeList);
};